/**
 * Universidad Del Valle De Guatemala.
 * Algoritmos y Estructuras de Datos.
 * Sección 20.
 * Miguel Enrique Zea Arenales.
 * Carné 09238.
 * Hoja de Trabajo 8.
 * 08/11/2012
 */
package shortestpath;

import java.util.ArrayList;

/**
 * Clase que describe un grafo dirigido mediante una matriz de adyacencia, 
 * empleado para la resolución del problema.
 */
public class DirectedGraphMatrix {
    private GraphMatrix<String,Edge> GraphMat; // Grafo con matriz de adyacencia.
    
    /**
     * Pre: ninguna.
     * Post: se crea un grafo dirigido de dimensión especificada. 
     */
    public DirectedGraphMatrix(int dimension) {
        GraphMat = new GraphMatrix<String,Edge>(dimension, 999999, true);
    }
    
    /**
     * Pre: ninguna.
     * Post: se añade un vértice al grafo con dirección.
     */
    public void addVertex(String name) {
        int temp;
        this.GraphMat.add(name);
        temp = this.GraphMat.getVertices().indexOf(name);
        this.GraphMat.setMatrixEntry(temp, temp, 0);
    }
    
    /**
     * Pre: ninguna.
     * Post: se establece la conexión entre 2 vértices contenidos en el grafo dirigido. 
     */
    public void addEdge(String vtx1, String vtx2, int weight){
        if((this.GraphMat.getVertices().contains(vtx1)) && (this.GraphMat.getVertices().contains(vtx1))) {
            this.GraphMat.addEdge(new Edge<String>(vtx1, vtx2, weight));
            int i, j;
            i = this.GraphMat.getVertices().indexOf(vtx1);
            j = this.GraphMat.getVertices().indexOf(vtx2);
            this.GraphMat.setMatrixEntry(i, j, weight);
        }
    }
    
    /**
     * Pre: ninguna.
     * Post: se retorna la matriz de adyacencia del grafo dirigido. 
     */
    public int[][] getAdjMat() {
        return this.GraphMat.getAdjacencyMatrix();
    }
    
    /**
     * Pre: ninguna.
     * Post: retorna el número de vértices contenidos en el grafo.
     */
    public int size() {
        return this.GraphMat.size();
    }
    
    /**
     * Pre: ninguna.
     * Post: se obtiene el vértice asociado al índice indicado.
     */
    public String getVertex(int idx) {
        return this.GraphMat.getVertices().get(idx);
    }
    
    /**
     * Pre: ninguna.
     * Post: retorna la lista de vértices contenidos en el grafo con dirección.
     */
    public ArrayList<String> getVertices() {
        return this.GraphMat.getVertices();
    }
}
